#!/usr/bin/env python3

# Copyright (c) 2005-2014 Fpemud <fpemud@sina.com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.


import re
import pygit2
import subprocess
from ...._util import Util, TempChdir
from ...._plugin import KernelAddonPlugin


class Plugin(KernelAddonPlugin):

    __url = "mirror://github/atar-axis/xpadneo"

    def sync(self, context):
        context.distfiles_github_clone_or_update(self.__url)

    def list_versions(self, context):
        localFullfn = context.distfiles_git_get("xpadneo")
        return [str(pygit2.Repository(localFullfn).head.peel(pygit2.Commit).id)]

    def list_distfiles(self, context):
        return [context.distfiles_git_fn("xpadneo")]

    def fetch(self, context):
        for version in context.versions:
            context.distfiles_github_clone_or_update(self.__url, commit_or_tag=version)

    def unpack(self, context):
        context.distfiles_git_use("xpadneo", commit_or_tag=context.version)

    def install(self, context):
        makeOpts = context.get_build_variable("MAKEOPTS")
        with TempChdir("./hid-xpadneo"):
            # use version of the building kernel
            Util.sed("Makefile", "$(shell uname -r)", context.get_kernel_version())

            # here we have to use shell=True because make doesn't get current directory from OS but reads from bash $PWD, sucks
            subprocess.check_call("make %s modules > make-xpadneo-module.log" % (makeOpts), shell=True)
            subprocess.check_call("make %s modules_install > make-xpadneo-module-install.log" % (makeOpts), shell=True)

    def add_kernel_init_cmdline_parameter(self, context):
        if "disable_deadzones" in self.params:
            if self.params["disable_deadzones"] not in ["0", "1"]:
                raise self.AddKernelInitCmdlineParameterError("invalid \"disable_deadzones\" parameter")
            context.add_kernel_init_cmdline_parameter("hid_xpadneo.disable_deadzones=%s" % (self.params["disable_deadzones"]))

        if "trigger_rumble_mode" in self.params:
            if self.params["trigger_rumble_mode"] not in ["0", "1", "2"]:
                raise self.AddKernelInitCmdlineParameterError("invalid \"trigger_rumble_mode\" parameter")
            context.add_kernel_init_cmdline_parameter("hid_xpadneo.trigger_rumble_mode=%s" % (self.params["trigger_rumble_mode"]))

        if "rumble_attenuation" in self.params:
            m = re.fullmatch("([0-9]+)(,([0-9]+))?", self.params["rumble_attenuation"])
            if m is None:
                raise self.AddKernelInitCmdlineParameterError("invalid \"rumble_attenuation\" parameter")

            try:
                n1 = int(m.group(1))
                if not (0 <= n1 <= 100):
                    raise self.AddKernelInitCmdlineParameterError("invalid \"rumble_attenuation\" parameter")
            except ValueError:
                raise self.AddKernelInitCmdlineParameterError("invalid \"rumble_attenuation\" parameter")

            if True:
                n2 = m.group(3)
                if n2 is not None:
                    try:
                        n2 = int(m.group(1))
                        if not (0 <= n2 <= 100):
                            raise self.AddKernelInitCmdlineParameterError("invalid \"rumble_attenuation\" parameter")
                    except ValueError:
                        raise self.AddKernelInitCmdlineParameterError("invalid \"rumble_attenuation\" parameter")

            context.add_kernel_init_cmdline_parameter("hid_xpadneo.rumble_attenuation=%s" % (self.params["rumble_attenuation"]))

        # FIXME
        assert "quirks" not in self.params

        if "disable_shift_mode" in self.params:
            if self.params["disable_shift_mode"] not in ["0", "1"]:
                raise self.AddKernelInitCmdlineParameterError("invalid \"disable_shift_mode\" parameter")
            context.add_kernel_init_cmdline_parameter("hid_xpadneo.disable_shift_mode=%s" % (self.params["disable_shift_mode"]))
